home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 September / Enter 09 2006.iso / Internet / SpamExperts Home 1.1 / SpamExperts Home.exe / lib / spamexperts.modules / spamexperts / FileCorpus.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-07-14  |  7.6 KB  |  217 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''FileCorpus.py - Corpus composed of file system artifacts.'''
  5. import sys
  6. import gzip
  7. import email
  8. from Crypto.Cipher import AES
  9. from spambayes.Corpus import ExpiryCorpus
  10. from spambayes.storage import NO_TRAINING_FLAG
  11. from spambayes.FileCorpus import FileCorpus, FileMessage
  12. from spambayes.FileCorpus import MessageFactory, GzipFileMessage
  13. from spamexperts.Options import options
  14. from spamexperts.OptionsClass import DELAYED
  15. from spamexperts.message import SEHeaderMessage
  16.  
  17. class SEFileMessage(FileMessage):
  18.     message_class = SEHeaderMessage
  19.     
  20.     def load(self):
  21.         '''Read the Message substance from the file.'''
  22.         if self.loaded:
  23.             return None
  24.         
  25.         if not self.file_name is not None:
  26.             raise AssertionError, 'Must set filename before using FileMessage instances.'
  27.         pn = self.pathname()
  28.         if options[('globals', 'verbose')]:
  29.             print 'Loading', self.file_name
  30.         
  31.         key = '%.16i' % hash(pn.lower())[:16]
  32.         crypt = AES.new(key)
  33.         fp = gzip.open(pn, 'rb')
  34.         
  35.         try:
  36.             self._msg = email.message_from_string(fp.read(), _class = self.message_class)
  37.         except IOError:
  38.             e = None
  39.             if str(e) == 'Not a gzipped file' or str(e) == 'Unknown compression method':
  40.                 fp.close()
  41.                 fp = open(self.pathname(), 'rb')
  42.                 content = fp.read()
  43.                 if len(content) % 16 == 0:
  44.                     content = crypt.decrypt(content).rstrip('\x00')
  45.                 
  46.                 self._msg = email.message_from_string(content, _class = self.message_class)
  47.                 fp.close()
  48.             else:
  49.                 raise 
  50.         except:
  51.             str(e) == 'Unknown compression method'
  52.  
  53.         fp.close()
  54.         self.loaded = True
  55.  
  56.     
  57.     def store(self):
  58.         '''Write the Message substance to the file'''
  59.         if not self.file_name is not None:
  60.             raise AssertionError, 'Must set filename before using FileMessage instances.'
  61.         if options[('globals', 'verbose')]:
  62.             print 'storing', self.file_name
  63.         
  64.         pn = self.pathname()
  65.         key = '%.16i' % hash(pn.lower())[:16]
  66.         crypt = AES.new(key)
  67.         as_string = self.as_string()
  68.         as_string = as_string + '\x00' * (16 - len(as_string) % 16)
  69.         if not len(as_string) % 16 == 0:
  70.             raise AssertionError, 'Must be multiple of 16 (not %d).' % (len(as_string),)
  71.         as_string = crypt.encrypt(as_string)
  72.         fp = open(pn, 'wb')
  73.         fp.write(as_string)
  74.         fp.close()
  75.  
  76.  
  77.  
  78. class SEFileMessageFactory(MessageFactory):
  79.     klass = SEFileMessage
  80.  
  81.  
  82. class SEGzipFileMessage(GzipFileMessage):
  83.     message_class = SEHeaderMessage
  84.  
  85.  
  86. class SEGzipFileMessageFactory(MessageFactory):
  87.     klass = SEGzipFileMessage
  88.  
  89.  
  90. class CarefulFileCorpus(FileCorpus):
  91.     """FileCorpus that is aware of SpamExperts 'delayed' messages and
  92.     blocks removal of these by overwriting the removeMessage method."""
  93.     
  94.     def __init__(self, msg_db, factory, directory, filter, cacheSize):
  95.         """Just store the db that contains the 'delayed' message list"""
  96.         self.blocked_or_delayed_db = msg_db
  97.         FileCorpus.__init__(self, factory, directory, filter, cacheSize)
  98.         self.headers = { }
  99.         self.headersInMemory = []
  100.  
  101.     
  102.     def __len__(self):
  103.         return len(self.msgs)
  104.  
  105.     
  106.     def takeMessage(self, key, fromcorpus, fromCache = False):
  107.         '''Move a Message from another corpus to this corpus.
  108.  
  109.         If we are moving from another cache, pass that information on to
  110.         the removeMessage method.'''
  111.         msg = fromcorpus[key]
  112.         msg.setId(key)
  113.         msg.load()
  114.         msg.message_info_db.load_msg(msg)
  115.         if msg.GetTrained() is None:
  116.             observer_flags = NO_TRAINING_FLAG
  117.         else:
  118.             observer_flags = 0
  119.         fromcorpus.removeMessage(msg, observer_flags = observer_flags, fromCache = fromCache)
  120.         self.addMessage(msg)
  121.  
  122.     
  123.     def removeMessage(self, msg, observer_flags = 0, fromCache = False):
  124.         '''Careful removal. 
  125.  
  126.         When not moving, any attempt to delete a delayed message will
  127.         be prevented.'''
  128.         if not fromCache:
  129.             msg_id = msg.getId()
  130.             (account, blockstate) = msg.getBlockingState()
  131.             if options[('globals', 'verbose')]:
  132.                 print 'Removing message %s, %s, %s' % (msg_id, account, blockstate)
  133.             
  134.             if blockstate == DELAYED:
  135.                 if options[('globals', 'verbose')]:
  136.                     print >>sys.stderr, 'removeMessage: Attempt to remove delayed message intercepted. Message %s not removed' % (msg_id,)
  137.                 
  138.                 return None
  139.             
  140.         
  141.         FileCorpus.removeMessage(self, msg, observer_flags = observer_flags)
  142.  
  143.     headerCacheSize = 1000
  144.     headersToCache = ('From', 'Subject', 'Date', 'Delivery-Date', 'To', 'X-SpamExperts-Date')
  145.     
  146.     def cacheMessageHeaders(self, msg):
  147.         key = msg.key()
  148.         to_cache = { }
  149.         for header in self.headersToCache:
  150.             to_cache[header] = msg[header]
  151.         
  152.         self.headers[key] = to_cache
  153.         
  154.         try:
  155.             self.headersInMemory.remove(key)
  156.         except ValueError:
  157.             pass
  158.  
  159.         self.headersInMemory.append(key)
  160.         if len(self.headersInMemory) > self.headerCacheSize:
  161.             key = self.headersInMemory.pop(0)
  162.             
  163.             try:
  164.                 del self.headers[key]
  165.             except KeyError:
  166.                 print >>sys.stderr, "Can't expire headers from cache."
  167.                 if options[('globals', 'verbose')]:
  168.                     import traceback
  169.                     traceback.print_exc(None, sys.stderr)
  170.                     print >>sys.stderr, 'Key is:', key
  171.                     print >>sys.stderr, 'All keys:', self.headers.keys()
  172.                 
  173.             except:
  174.                 options[('globals', 'verbose')]
  175.             
  176.  
  177.         None<EXCEPTION MATCH>KeyError
  178.  
  179.     
  180.     def cacheMessage(self, msg):
  181.         FileCorpus.cacheMessage(self, msg)
  182.         
  183.         try:
  184.             msg.load()
  185.         except:
  186.             import traceback
  187.             print >>sys.stderr, 'Error occuring trying to load message to cache headers.'
  188.             traceback.print_exc(None, sys.stderr)
  189.             return None
  190.  
  191.         self.cacheMessageHeaders(msg)
  192.  
  193.     
  194.     def get_headers(self, msg):
  195.         '''Return cached headers for a message.'''
  196.         key = msg.key()
  197.         
  198.         try:
  199.             return self.headers[key]
  200.         except KeyError:
  201.             pass
  202.  
  203.         msg.load()
  204.         self.cacheMessageHeaders(msg)
  205.         return self.headers[key]
  206.  
  207.  
  208.  
  209. class CarefulExpiryFileCorpus(ExpiryCorpus, CarefulFileCorpus):
  210.     '''Careful FileCorpus of "young" file system artifacts.'''
  211.     
  212.     def __init__(self, expireBefore, msg_db, factory, directory, filter = '*', cacheSize = 250):
  213.         ExpiryCorpus.__init__(self, expireBefore)
  214.         CarefulFileCorpus.__init__(self, msg_db, factory, directory, filter, cacheSize)
  215.  
  216.  
  217.